package org.szy.core.auth.util;

import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.NotPermissionException;
import cn.dev33.satoken.exception.NotRoleException;
import cn.dev33.satoken.exception.SaTokenException;
import cn.hutool.http.HttpStatus;
import org.noear.solon.Solon;
import org.noear.solon.core.handle.Context;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.szy.core.common.entity.R;
import org.szy.core.common.uilts.ReqUtil;

public class AuthExceptionUtil {

    private static final Logger log = LoggerFactory.getLogger(AuthExceptionUtil.class);

    /**
     * 根据错误类型获取对应的R（只处理SaToken相关异常）
     *
     * @author wangbuhao
     * @date 2021/10/11 15:52
     */
    public static R<?> getResult(Exception e) {
        R<?> r;
        Context ctx = Context.current();
        boolean ajax = ReqUtil.isAjax(ctx);
        if (e instanceof NotLoginException) {
            // 如果是未登录异常 401
            NotLoginException notLoginException = (NotLoginException) e;
            if (ajax) {
                r = R.fail(HttpStatus.HTTP_UNAUTHORIZED, "用户未登录", null);
            } else {
                String loginUrl = Solon.app().cfg().get("sa-token.loginUrl", "/anon/login");
                log.error("跳转到登陆页面：{}", loginUrl);
                ctx.redirect(loginUrl + "?type=" + notLoginException.getType());
                return null;
            }
        } else if (e instanceof NotRoleException) {
            // 如果是角色异常 403
            if (ajax) {
                NotRoleException notRoleException = (NotRoleException) e;
                r = R.fail(HttpStatus.HTTP_FORBIDDEN, "无此角色：" + notRoleException.getRole() +
                        "，接口地址：" + ReqUtil.getContext().path(), null);
            } else {
                ctx.forward("/error/403");
                return null;
            }
        } else if (e instanceof NotPermissionException) {
            // 如果是权限异常 403
            if (ajax) {
                NotPermissionException notPermissionException = (NotPermissionException) e;
                r = R.fail(HttpStatus.HTTP_FORBIDDEN, "无此权限：" + notPermissionException.getPermission(), null);
            } else {
                ctx.forward("/error/403");
                return null;
            }
        } else if (e instanceof SaTokenException) {

            // 如果是SaToken异常 直接返回
            SaTokenException saTokenException = (SaTokenException) e;
            r = R.fail(saTokenException.getMessage());
        } else {
            // 未知异常返回服务器异常（此处不可能执行进入，因为本方法处理的一定是SaToken的异常，此处仅为安全性考虑）
            r = R.fail("用户异常");
        }
        log.error(">>> {}，请求地址：{}", r.getMsg(), SaHolder.getRequest().getUrl());
        return r;
    }
}
